package com.ljt.common.utils;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

/**
 * 完成对多种加密算法的封装，如MD5、SHA等，支持多种输入格式，如文件、字符串等，标准化输出格式
 *
 * @ClassName: Cryptography
 * @author chenting
 * @date 2017年7月30日
 *
 */
public class MD5Utils
{
	/**
	 * Method byteHEX. 用来把一个byte类型的数转换成十六进制的ASCII表示，
	 * 因为java中的byte的toString无法实现这一点，转出来都是乱码，为了在数据库中存储方便特设此方法。
	 * @param ib 一个byte类型的值
	 * @return String
	 */
	private static String byteHEX(byte ib)
	{
		char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
		char[] ob = new char[2];
		ob[0] = Digit[(ib >>> 4) & 0X0F];
		ob[1] = Digit[ib & 0X0F];
		String s = new String(ob);
		return s;
	}
	public static String password(String password,String username){
		StringBuffer sb = new StringBuffer();
		username = username.toLowerCase();
		sb.append(username, 0, 1).append(password, 0, 2).append(username, 1, 2).append(password, 2, 6).append(username, 2, 4).append(password.substring(6)).append(username.substring(4));
		return getMD5ofString(sb.toString());
	}
	/**
	 * Method getMD5ofString.对输入的字符串进行MD5加密，然后返回密文
	 * @param plainStr 加密前的明文，可以为空“”，但不能是null。
	 * @return String 加密后的密文
	 */
	public static String getMD5ofString(String plainStr)
	{
		//检查输入字符串不能为null
		if (plainStr == null)
			return null;
		try
		{ //用UTF8编码
			byte[] plainText = plainStr.getBytes(StandardCharsets.UTF_8);
			//执行编码
			MessageDigest messageDigest;
			messageDigest = MessageDigest.getInstance("MD5");
			messageDigest.update(plainText);
			//取得密文初步结果:一个16位的byte数组
			byte[] md = messageDigest.digest();
			//将此数组转换为标准格式:16进制表示
			String digestHexStr = "";
			for (int i = 0; i < 16; i++)
			{
				digestHexStr += byteHEX(md[i]);
			}
			//返回结果
			return digestHexStr;
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}

	public static void main(String[] args) {
		System.out.println(com.ljt.common.utils.MD5Utils.getMD5ofString("123456").toLowerCase());
	}
}
